﻿using CleanToolkit.Comparison.Comparers;
using CleanToolkit.Comparison.DiffModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Xml.Serialization;
using CleanToolkit.FieldsExctration;
using CleanToolkit.Formating;

namespace CleanToolkit
{
    public class CleanerFacade
    {
        public static String SayHello()
        {
            return "Hello !";
        }

        public static String SayHello(string s_input)
        {
            return string.Format("Hello {0} !", s_input);
        }

        /// <summary>
        /// Récupération des différences de SField entre 2 fichiers de définition contenant les déclaration de SPFields.
        /// Les "Différences" portent sur
        /// * les différences de valeurs entre les attributs des SPFields du fichier d'origine et ceux du fichier de comparaison,
        /// * les différences de valeurs des formules de calculs des SPFields du fichier d'origine et ceux du fichier de comparaison.
        /// </summary>
        /// <param name="s_SchemaFilePath"></param>
        /// <param name="s_FieldsFilePath"></param>
        /// <returns></returns>
        public static SchemaFieldsDiff GetFieldsDiff(string s_SchemaFilePath, string s_FieldsFilePath)
        {
            SchemaFieldsDiff result = null;
            //-----------------------------------------------------------------------------


            //Initialisation du compareur
            FieldsComparer comparer = new FieldsComparer()
            {
                SchemaFilePath = s_SchemaFilePath,
                FieldsFilePath = s_FieldsFilePath
            };

            // Récupération des différences
            List<FieldDiffs> data = comparer.GetDiff();
            result = new SchemaFieldsDiff(data);


            //-----------------------------------------------------------------------------
            return result;
        }

        /// <summary>
        /// Récupération de la déclaration des champs pour un Schéma à partir de la liste des colonnes souhaitées et du fichier de définition des colonnes
        /// </summary>
        /// <param name="s_FieldsFilePath"></param>
        /// <returns></returns>
        public static XDocument GetSchemaFieldsDef(string s_FieldsFilePath, string s_NeededFieldsIdsFilePath)
        {
            XDocument result = null;
            //-----------------------------------------------------------------------------

            // Création de l'extracteur
            SchemaFieldsExtractor extractor = new SchemaFieldsExtractor()
            {
                FieldsDefFilePath = s_FieldsFilePath,
                NeededFieldsIdsFilePath = s_NeededFieldsIdsFilePath
            };

            // Extraction des camps
            result = extractor.ExtractFields();


            //-----------------------------------------------------------------------------
            return result;
        }

        /// <summary>
        /// Récupération de la déclaration des champs pour un Type de contenu à partir de la liste des colonnes souhaitées et du fichier de définition des colonnes
        /// </summary>
        /// <param name="s_FieldsFilePath"></param>
        /// <returns></returns>
        public static XDocument GetContentTypeFieldsDef(string s_FieldsFilePath, string s_NeededFieldsIdsFilePath)
        {
            XDocument result = null;
            //-----------------------------------------------------------------------------

            // Création de l'extracteur
            ContentTypeFieldsExtractor extractor = new ContentTypeFieldsExtractor()
            {
                FieldsDefFilePath = s_FieldsFilePath,
                NeededFieldsIdsFilePath = s_NeededFieldsIdsFilePath
            };

            // Extraction des camps
            result = extractor.ExtractFields();


            //-----------------------------------------------------------------------------
            return result;
        }

        /// <summary>
        ///  Transformation des valeurs de ressources en leur équivalent direct
        /// </summary>
        /// <param name="s_FieldsFilePath"></param>
        /// <param name="s_resFilePath"></param>
        /// <returns></returns>
        public static XDocument RemoveResFromFieldsStaticName(string s_FieldsFilePath, string s_resFilePath)
        {
            XDocument result = null;
            //-----------------------------------------------------------------------------

            // Creation du nettoyeur
            FieldsResNameRemover resRemover = new FieldsResNameRemover()
            {
                FieldsFilePath = s_FieldsFilePath,
                NamesFilePath = s_resFilePath
            };
            
            // Nettoyage
            result = resRemover.GetFieldWithoutResNames();


            //-----------------------------------------------------------------------------
            return result;
        }

        /// <summary>
        /// Execution d'une transformation XSL
        /// </summary>
        /// <param name="s_Input"></param>
        /// <param name="s_Xsl"></param>
        /// <param name="s_Output"></param>
        public static void TransformXSL(string s_Input, string s_Xsl, string s_Output)
        {
            XslTransformer.Transform(s_Input, s_Xsl, s_Output);
        }
    }
}
